package medimg.JDBC;

import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * Dodatkowe metody niezbędne dla JDBC. Dodawanie userow DDL i nadawanie uprawnien.
 * @author PSI
 */
public class JDBCUtil {

    static Connection con= null;
    static java.sql.Statement statement;

    /*
     * Laczenie do bazy danych za pomoca JDBC
     * @param URL dla podlaczenia
     * @param username
     * @param password
     */
    static public void ConnectToDB(String connectionUrl, String username, String password){
            try {
                // Ładujemy plik z klasą sterownika bazy danych
                //   Class.forName(org.apache.derby.jdbc.ClientDriver);
                // Tworzymy połączenie do bazy danych
                con = (Connection) DriverManager.getConnection(connectionUrl, username, password);
            } catch (Exception e) {
                System.err.println("Another exception: " + e.getMessage());
            }
        System.out.println("Test");
    }

     /**
     * Dodanie uzytkownika do bazy za pomoca DDL.
      * @param username 
      * @param host
      * @param user
     */
    static public void createUserInDB(String username, String host, String password){
        try{
            // Tworzymy obiekt wyrażenia
            statement = con.createStatement();
            // Wysyłamy zapytanie do bazy danych
             statement.executeUpdate("CREATE USER '" + username + "'@'" + host + "' IDENTIFIED BY '" + password + "';");
        } catch (SQLException sqle) {
            System.err.println("SQL exception: " + sqle.getMessage());
        } catch (Exception e) {
            System.err.println("Another exception: " + e.getMessage());
        }
    }

     /**
     * Dodanie uprawnien uzytkownikowi
      * @param username dla uprawnien
      * @param host z ktorego user sie loguje
      * @param opziom uprawnien:
      * 0 - pacjent
      * 1 - lekarz
      * 2 - technik
     */
    static public void addPrivilegesToUser(String username, String host, int privilegeLevel){
        try{
            // Tworzymy obiekt wyrażenia
            statement = con.createStatement();
            // Wysyłamy zapytanie do bazy danych w zaleznosci od poziomu uprawnien
            switch(privilegeLevel){
                case 0: //uprawnienia dla pacjenta
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`pacjenci` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`zdjecia` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`rodzaj_badan` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`badania` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`personel` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`funkcje` TO  '" + username + "'@'" + host + "';");
                    break;
                case 1://uprawnienia dla lekarza
                    statement.executeUpdate("GRANT SELECT ON  `medimg`. * TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT CREATE USER  ON * . * TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT INSERT, DROP, UPDATE, DELETE ON  `medimg`.`rodzaj_badan` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT INSERT, DROP, UPDATE, DELETE ON  `medimg`.`zdjecia` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT INSERT, DROP, UPDATE, DELETE ON  `medimg`.`pacjenci` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT INSERT, DROP, UPDATE, DELETE ON  `medimg`.`badania` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT INSERT, DROP, UPDATE, DELETE ON  `medimg`.`funkcje` TO  '" + username + "'@'" + host + "';");
                    break;
                case 2://uprawnienia dla technika
                    statement.executeUpdate("GRANT ALL PRIVILEGES ON `medimg`. * TO  '" + username + "'@'" + host + "';");
                    break;
                default:
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`pacjenci` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`zdjecia` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`rodzaj_badan` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`badania` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`personel` TO  '" + username + "'@'" + host + "';");
                    statement.executeUpdate("GRANT SELECT ON  `medimg`.`funkcje` TO  '" + username + "'@'" + host + "';");
                    break;
            }
        } catch (SQLException sqle) {
            System.err.println("SQL exception: " + sqle.getMessage());
        } catch (Exception e) {
            System.err.println("Another exception: " + e.getMessage());
        }
    }

    
    public static void main(String[] args) {
        ConnectToDB("jdbc:mysql://localhost:3306/medimg", "89020111336", "haslo123");
        createUserInDB("pablo","localhost","pass");
        addPrivilegesToUser("pablo","localhost",1);
    }

}
